2

(个人理解ES6就是对ES5的BUG修改和升级)
废话不多说今天要探讨的是 varlet
ECMAScript 6 入门 作者:阮一峰

下面是个人总结:
let不允许在相同作用域内,重复声明同一个变量。
let 特点是块级作用域

先来看一下ES5中时常出现的变量提升的问题!

    var tmp = new Date();
    function f() {
        console.log(tmp);
        if(false) {
            var tmp = 'hello world';
        }
        console.log(tmp);
    }

输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。

在ES6的语法中解决的变量提升的问题 是这么实现的!

    function f1() {
         let n = 5;
        if (true) {
            let n = 10;
        }
        console.log(n); // 5
    }

这里大家可以自己试验 将内层 和外层的 n 分别用var let 来定义 就发现
let不允许在相同作用域内,重复声明同一个变量。
lef 特点是块级作用域
let 的特点得到明显的体现!

再看一个ES5中的循环变量泄露为全局变量

    var s = 'hello';
    for (var i = 0; i < s.length; i++) {
      console.log(s[i]);
    }
    console.log(i); // 5

很明显i成了全局变量。
ES6中

    for (let i = 0; i < 10; i++) {
      // ...
    }
    
    console.log(i); 
    // ReferenceError: i is not defined

这表明,let声明的变量只在它所在的代码块有效。

本人目前了解的还不够深!
比如ES6中添加一个新的词汇 “暂时性死区”(temporal dead zone,简称 TDZ)。

    var tmp = 123;
    if (true) {
      tmp = 'abc'; // ReferenceError
      let tmp;
    }

我可以把它理解为ES6解决不了的BUG!非要给他定义成一个词汇么?(笑死)!
也希望大牛前来解答探讨!


三月
425 声望105 粉丝

街市人如鲫,晤君当有期,阴晴岁月稠,黯然眠中泣,相逢属不易,缘定自珍惜。